package org.dppc.fine4j.proxychain.support;

import org.dppc.fine4j.proxychain.ProxyHandler;

public class AutoProxyHandlerFactory {
	
	/**
	 * 根据需要 选择JDK方式还是Cglib方式来创建 ProxyHandler 实例
	 * 
	 * @param targetClass
	 * @param isForcible
	 * @return
	 */
	public static ProxyHandler createProxyHandler(Class<?> targetClass, boolean isForcible) {
		// 不采用强制
		if (isForcible == false) {
			// 首先尝试使用JDK动态代理方式
			Class<?>[] interfaces =targetClass.getInterfaces();
			if (interfaces != null && interfaces.length > 0) {
				return ProxyHandlerFactory.newJDKProxyHandler(interfaces);
			}
			
			// 检查 是否存在CGlib
			ClassLoader loader =Thread.currentThread().getContextClassLoader();
			Class<?> cglibClass =null;
			try {
				cglibClass = Class.forName("net.sf.cglib.proxy.Enhancer", false, loader);
			} catch (Throwable t) {
			}
			if (cglibClass == null) {
				throw new RuntimeException("代理类[" +targetClass.getName() +"] 没有实现任何接口，JDK动态代理无法创建！");
			}
		}
		// 再尝试采用 CGlib 方式
		return ProxyHandlerFactory.newCGlibProayHandler(targetClass);
	}
}
